#include <algorithm>
#include <bitset>
#include <cstdint>
#include <iostream>
#include <istream>
#include <queue>
#include <utility>
#include <vector>

using ll = int64_t;

int main(){
    std::iostream::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);

    const ll max_n = 1e5+5;
    ll n;
    std::cin>>n;
    auto *edge = new std::vector<ll>[max_n];
    ll a, b;
    for(ll i{1}; i<n; i++){
        std::cin>>a>>b;
        edge[a].push_back(b);
        edge[b].push_back(a);
    }
    std::queue<std::pair<ll, ll>> q;
    q.emplace(0, a);
    std::bitset<max_n> vis;
    vis[a]=true;
    ll max_a{}, max{};
    while(!q.empty()){
        auto top = q.front();
        q.pop();
        if(top.first > max){
            max = top.first;
            max_a = top.second;
        }
        for(auto &i:edge[top.second]){
            if(vis[i]){
                continue;
            }
            q.push({top.first + 1, i});
            vis[i] = true;
        }
    }
    q = std::queue<std::pair<ll, ll>>();
    q.emplace(0, max_a);
    vis.reset();
    vis[max_a]=true;
    ll ans{};
    while(!q.empty()){
        auto top = q.front();
        q.pop();
        ans = std::max(ans, top.first);
        for(auto i: edge[top.second]){
            if(vis[i]){
                continue;
            }
            q.push({top.first+1, i});
            vis[i] = true;
        }
    }
    std::cout<<ans<<'\n';
}